//package com.wanlian;
//
//import java.io.*;
//import java.math.RoundingMode;
//import java.net.ServerSocket;
//import java.net.Socket;
//import java.text.DecimalFormat;
//
//
//public class SocketServer extends ServerSocket {
//
//    private static final int SERVER_PORT = 8899; // 服务端端口
//
//    private static DecimalFormat df = null;
//
//    static {
//        // 设置数字格式，保留一位有效小数
//        df = new DecimalFormat("#0.0");
//        df.setRoundingMode(RoundingMode.HALF_UP);
//        df.setMinimumFractionDigits(1);
//        df.setMaximumFractionDigits(1);
//    }
//
//    public SocketServer() throws Exception {
//        super(SERVER_PORT);
//    }
//
//    /**
//     * 使用线程处理每个客户端传输的文件
//     *
//     * @throws Exception
//     */
//    public void load() throws Exception {
//        while (true) {
//            // server尝试接收其他Socket的连接请求，server的accept方法是阻塞式的
//            Socket socket = this.accept();
//            // 每接收到一个Socket就建立一个新的线程来处理它
//            new Thread(new Task(socket)).start();
//        }
//    }
//
//    /**
//     * 处理客户端传输过来的文件线程类
//     */
//    class Task implements Runnable {
//
//        private Socket socket;
//
//        private String value;
//
//        private DataInputStream dis;
//
//        private FileOutputStream fos;
//
//        public Task(Socket socket) {
//            this.socket = socket;
//        }
//        @Override
//        public void run() {
//            try {
//                dis = new DataInputStream(socket.getInputStream());
//                // 文件名和长度
//                String fileName = dis.readUTF();
//                long fileLength = dis.readLong();
//                File directory = new File("/Users/zhaoxiaotong/Downloads/SocketServer");
//                if (!directory.exists()) {
//                    directory.mkdir();
//                }
//                File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
//                fos = new FileOutputStream(file);
//
//                // 开始接收文件
//                byte[] bytes = new byte[1024];
//                int length = 0;
//                while ((length = dis.read(bytes, 0, bytes.length)) != -1) {
//                    fos.write(bytes, 0, length);
//                    fos.flush();
//                }
//                System.out.println("======== 文件接收成功 [File Name：" + fileName + "] [Size：" + getFormatFileSize(fileLength) + "] ========");
//            } catch (Exception e) {
//                e.printStackTrace();
//            } finally {
//                try {
//                    if (fos != null)
//                        fos.close();
//                    if (dis != null)
//                        dis.close();
//                    socket.close();
//                } catch (Exception e) {
//                }
//            }
//        }
//    }
//
//
//
//
//    public void downFile(String filePath) {
//    //接受客户端的下载请求，将本地文件传输给客户端
//        try {
//            while (true) {
//                // 选择进行传输的文件
//                File fi = new File(filePath);
//                System.out.println("文件长度:" + (int) fi.length());
//                // IOException侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
//                Socket socket = this.accept();
//                System.out.println("建立socket链接");
//                DataInputStream fis = new DataInputStream(new BufferedInputStream(new FileInputStream(filePath)));
//                DataOutputStream ps = new DataOutputStream(socket.getOutputStream());
//                //将文件名及长度传给客户端。
//                ps.writeUTF(fi.getName());
//                System.out.println(fi.getName());
//                ps.flush();
//                int bufferSize = 8192;
//                byte[] buf = new byte[bufferSize];
//                while (true) {
//                    int read = 0;
//                    if (fis != null) {
//                        read = fis.read(buf);
//                    }
//                    if (read == -1) {
//                        break;
//                    }
//                    ps.write(buf, 0, read);
//                }
//                ps.flush();
//                // 直到socket超时，导致数据不完整。
//                fis.close();
//                //当客户端返回接收成功时返回给我一个标识，关闭socket
//                //socket.close();
//                System.out.println("文件传输完成");
//            }
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//
//
//    /**
//     * 格式化文件大小
//     *
//     * @param length
//     * @return
//     */
//    private String getFormatFileSize(long length) {
//        double size = ((double) length) / (1 << 30);
//        if (size >= 1) {
//            return df.format(size) + "GB";
//        }
//        size = ((double) length) / (1 << 20);
//        if (size >= 1) {
//            return df.format(size) + "MB";
//        }
//        size = ((double) length) / (1 << 10);
//        if (size >= 1) {
//            return df.format(size) + "KB";
//        }
//        return length + "B";
//    }
//
//    public static void main(String[] args) {
//        try {
//            SocketServer server = new SocketServer(); // 启动服务端
//           // server.load();
//           server.downFile("/Users/zhaoxiaotong/Downloads/1539744667535.mp4");
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//
//
//}
